package com.example.demo.service;

import com.example.demo.entity.Article;
import com.example.demo.entity.Tag;

import java.util.List;

/**
 * 文章服务接口
 * 定义文章相关业务操作
 */
public interface ArticleService {
    
    /**
     * 根据ID获取文章详情
     * @param id 文章ID
     * @param incrementView 是否增加阅读量
     * @return 文章详情
     */
    Article getArticleById(Long id, boolean incrementView);
    
    /**
     * 分页查询文章列表
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @param categoryId 分类ID（可选）
     * @param status 状态筛选（可选）
     * @param keyword 关键词搜索（可选）
     * @return 文章分页结果
     */
    PageResult<Article> getArticleList(int page, int size, Long categoryId, Integer status, String keyword);
    
    /**
     * 获取置顶文章列表
     * @param limit 数量限制
     * @return 置顶文章列表
     */
    List<Article> getTopArticles(int limit);
    
    /**
     * 获取最新文章列表
     * @param limit 数量限制
     * @return 最新文章列表
     */
    List<Article> getRecentArticles(int limit);
    
    /**
     * 获取热门文章列表
     * @param limit 数量限制
     * @return 热门文章列表
     */
    List<Article> getPopularArticles(int limit);
    
    /**
     * 根据标签获取文章列表
     * @param tagId 标签ID
     * @param page 页码
     * @param size 每页大小
     * @return 文章分页结果
     */
    PageResult<Article> getArticlesByTag(Long tagId, int page, int size);
    
    /**
     * 根据作者获取文章列表
     * @param authorId 作者ID
     * @param page 页码
     * @param size 每页大小
     * @return 文章分页结果
     */
    PageResult<Article> getArticlesByAuthor(Long authorId, int page, int size);
    
    /**
     * 创建文章
     * @param article 文章信息
     * @param tagNames 标签名称列表
     * @return 创建的文章
     */
    Article createArticle(Article article, List<String> tagNames);
    
    /**
     * 更新文章
     * @param article 文章信息
     * @param tagNames 标签名称列表
     * @return 更新后的文章
     */
    Article updateArticle(Article article, List<String> tagNames);
    
    /**
     * 发布文章（将草稿状态改为发布）
     * @param id 文章ID
     * @return 是否成功
     */
    boolean publishArticle(Long id);
    
    /**
     * 隐藏文章
     * @param id 文章ID
     * @return 是否成功
     */
    boolean hideArticle(Long id);
    
    /**
     * 删除文章
     * @param id 文章ID
     * @return 是否成功
     */
    boolean deleteArticle(Long id);
    
    /**
     * 点赞文章
     * @param id 文章ID
     * @return 是否成功
     */
    boolean likeArticle(Long id);
    
    /**
     * 获取文章的标签列表
     * @param articleId 文章ID
     * @return 标签列表
     */
    List<Tag> getArticleTags(Long articleId);
    
    /**
     * 获取文章总数
     * @return 文章总数
     */
    long getTotalArticleCount();
    
    /**
     * 获取总浏览量
     * @return 总浏览量
     */
    long getTotalViewCount();
    
    /**
     * 分页结果封装类
     */
    class PageResult<T> {
        private List<T> records;
        private long total;
        private int page;
        private int size;
        private int pages;
        
        public PageResult() {}
        
        public PageResult(List<T> records, long total, int page, int size) {
            this.records = records;
            this.total = total;
            this.page = page;
            this.size = size;
            this.pages = (int) Math.ceil((double) total / size);
        }
        
        // Getter和Setter方法
        public List<T> getRecords() {
            return records;
        }
        
        public void setRecords(List<T> records) {
            this.records = records;
        }
        
        public long getTotal() {
            return total;
        }
        
        public void setTotal(long total) {
            this.total = total;
        }
        
        public int getPage() {
            return page;
        }
        
        public void setPage(int page) {
            this.page = page;
        }
        
        public int getSize() {
            return size;
        }
        
        public void setSize(int size) {
            this.size = size;
        }
        
        public int getPages() {
            return pages;
        }
        
        public void setPages(int pages) {
            this.pages = pages;
        }
    }
}
